import { Notification, MessageBox } from 'element-ui';
import { stringify } from 'qs';
import axios from 'axios';

if (MOCK_ENABLE) {
  import('./mock/index.js');
}

axios.defaults.baseURL = '/';

axios.defaults.timeout = 10000;
/* 实现默认使用表单数据格式 */
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
axios.interceptors.request.use(function(config) {
  if (!config.data) {
    return config;
  }
  if (config.dataType == 'json') {
    config.headers['Content-Type'] = 'application/json';
  }
  else if (config.data.toString() == '[object FormData]') {
    return config;
  }
  else if (config.dataType != 'json' && typeof config.data == 'object') {
    config.data = stringify(config.data);
    return config;
  }
  return config;
});

let loginTimeoutConfirmed = false;

/*
axios默认把data作为其属性的response对象作为参数传递给then回调。
但是根据来自本项目的经验，大部分情况下，我们只要data。
所以下面拦截器实现的是，默认将response.data作为then回调的参数，
如果你需要原response细节，请配置response:true，对于网络异常情况的处理，请使用catch
*/
axios.interceptors.response.use(function(response) {
  if (response.config.url == '/api/admin/login') {
    loginTimeoutConfirmed = false;
  }
  return response.config.response ? response : response.data;
}, (error) => {
  if (error.code == 'ECONNABORTED') {
    if (error.message.indexOf('timeout') > -1) {
      Notification.error({
        title: '错误',
        message: '请求服务器超时，请重试'
      });
    }
  }
  if (error.response) {
    let { status } = error.response;
    if (status == 440) {
      if (!loginTimeoutConfirmed) {
        loginTimeoutConfirmed = true;
        MessageBox.confirm('会话超时或失效，请刷新页面或点击重新登陆。', '会话失效', {
          confirmButtonText: '重新登陆',
          cancelButtonText: '好的',
          type: 'warning'
        }).then(() => {
          app.$router.replace('/login');
        });
      }
    } else {
      if (status == 502) {
        Notification.error({
          title: '提示',
          message: '服务暂停，请稍后访问'
        });
      } else {
        Notification.error({
          title: {4: '客户端错误', 5: '服务器错误'}[Math.floor(status / 100)],
          message: `${error.message}: ${error.config.url}`
        });
      }
    }
  }

  return Promise.reject(error);
});

export { axios };